/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.beans.Statement;
import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.ModeloDatos;
import modelo.ModeloExperimento;
import modelo.ModeloGrafica;
import ui.Experimento;
import ui.Poblacion;

/**
 *
 * @author juanan
 */
public class InterfazFormatosBbddImplementation implements InterfazFormatos {

    private ModeloGrafica m;
    private ModeloDatos modeloDatos;
    private ModeloExperimento modeloExperimento;
    Connection conexion = null;
    Statement statment = null;
    ResultSet resulset = null;
    String driver;
    String url;
    String usuario;
    String pass;

    public InterfazFormatosBbddImplementation() {
        driver = "org.apache.derby.jdbc.ClientDriver";
        url = "jdbc:derby://localhost:1527/Bacterias";
        usuario = "admin";
        pass = "admin";
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(InterfazFormatosBbddImplementation.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void abrir(String nombre, Experimento experimento) {
        AbrirThread abrir = new AbrirThread(nombre, experimento);
        abrir.start();
    }

    @Override
    public void escribir(String nombre, Experimento experimento) {
        EscribirThread escribir = new EscribirThread(nombre, experimento);
        escribir.start();
    }

    private class AbrirThread extends Thread {

        String ruta;
        private Experimento experimento;
        private ModeloGrafica modeloGrafica;
        private ModeloDatos modeloDatos;
        private ModeloExperimento modeloExperimento;

        private AbrirThread(String ruta, Experimento experimento) {
            this.ruta = ruta;
            this.experimento = experimento;
        }

        @Override
        public void run() {
            ArrayList<String> lista1 = new ArrayList<String>();
            ArrayList<String> lista2 = new ArrayList<String>();

            String query1 = "SELECT * FROM poblacion";
            String query2 = "SELECT * FROM experimento";
            String query3 = "SELECT * FROM tabla";
            ResultSet rs, rs2, rs3;
            PreparedStatement ps=null;
            PreparedStatement ps2=null;
            PreparedStatement ps3=null;
            Connection conexion = null;

            
            try {
                conexion = DriverManager.getConnection(url, usuario, pass);
                ps = conexion.prepareStatement(query1);
                ps2 = conexion.prepareStatement(query2);
                ps3 = conexion.prepareStatement(query3);
                conexion = DriverManager.getConnection(url, usuario, pass);
                modeloGrafica = new ModeloGrafica();
                modeloDatos = new ModeloDatos();
                modeloExperimento = new ModeloExperimento();
                rs = ps.executeQuery();
                while (rs.next()) {

                    for (int columna = 1; columna <= 11; columna++) {
                        if (columna >= 3) {
                            String dato = rs.getString(columna);
                            lista1.add(dato);
                        }

                    }
                }
                rs2 = ps2.executeQuery();
                while (rs2.next()) {
                    for (int columna2 = 1; columna2 <= 3; columna2++) {
                        String dato = rs2.getString(columna2);
                        lista2.add(dato);
                    }
                }
                rs3 = ps3.executeQuery();
                while (rs3.next()) {
                    for (int columna2 = 1; columna2 <= 3; columna2++) {
                        String dato = rs3.getString(columna2);
                        lista2.add(dato);
                    }
                }


                modeloGrafica.setAlimentoInicial(Integer.parseInt(lista1.get(0)));
                modeloGrafica.setDiaAlimentoMax(Integer.parseInt(lista1.get(1)));
                modeloGrafica.setAlimentoMax(Integer.parseInt(lista1.get(2)));
                modeloGrafica.setAlimentoFinal(Integer.parseInt(lista1.get(3)));
                modeloDatos.setDate1(Integer.parseInt(lista1.get(4)));
                modeloDatos.setDate2(Integer.parseInt(lista1.get(5)));
                modeloDatos.setTemperatura(Integer.parseInt(lista1.get(6)));
                modeloDatos.setTamañoInicial(Integer.parseInt(lista1.get(7)));
                modeloDatos.setLuminosidad(Integer.parseInt(lista1.get(8)));
                modeloExperimento.setProyecto(lista2.get(0));
                modeloExperimento.setInvestigador(lista2.get(1));
                modeloExperimento.setTipoBacteria(lista2.get(2));

            } catch (SQLException ex) {
                Logger.getLogger(InterfazFormatosBbddImplementation.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    if (ps != null) {
                        ps.close();
                    }

                    if (ps != null) {
                        ps2.close();
                    }
                    if (ps != null) {
                        ps3.close();
                    }
                    if (conexion!=null)
                    {
                    conexion.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(InterfazFormatosBbddImplementation.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        //TODO run
    }

    private class EscribirThread extends Thread {
        //TODO run

        String ruta;
        private Experimento experimento;

        private EscribirThread(String ruta, Experimento experimento) {
            this.ruta = ruta;
            this.experimento = experimento;
        }

        @Override
        public void run() {


            Connection conexion = null;
            Statement statment = null;
            modeloExperimento = experimento.getmExp();
            String query1 = " INSERT INTO admin.poblacion (idpob, idexp, aliminicial,diaalimmax,alimmax,alimfinal,fechainicio,fechafin, temperatura, tamanhoinicial, luminosidad)"
                    + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

            String query2 = "INSERT INTO admin.experimento (idexp, investigador, tipobacteria) VALUES (?, ?, ?)";
            String query3 = "INSERT INTO admin.tabla (idexp, idpob, numdia, tamanho, muertas, temperatura, dosis) VALUES (?, ?, ?, ?, ?, ?, ?)";
            PreparedStatement ps = null;
            PreparedStatement ps2 = null;
            PreparedStatement ps3 = null;
            String idExperimento = modeloExperimento.getProyecto();
            String tipoBacteria = modeloExperimento.getTipoBacteria();
            String investigador = modeloExperimento.getInvestigador();
            try {
                conexion = DriverManager.getConnection(url, usuario, pass);

                int numFichas = experimento.getTabPane().getTabCount();
                for (int i = 0; i < numFichas; i++) {
                    Poblacion p = (Poblacion) experimento.getTabPane().getComponentAt(i);

                    m = p.getM();
                    modeloDatos = p.getmDatos();
                    modeloExperimento = p.getmExperimento();

                    ps3 = conexion.prepareStatement(query3);

                    for (int j = 0; j < 40; j++) {
                        ps3.setString(1, idExperimento);
                        ps3.setString(2, i + 1 + "");

                        ps3.setString(3, (((Integer) p.getTabla().getValueAt(j, 0) != null)
                                ? (Integer) p.getTabla().getValueAt(j, 0) + "" : "0"));
                        ps3.setString(4, (((Integer) p.getTabla().getValueAt(j, 1) != null)
                                ? (Integer) p.getTabla().getValueAt(j, 1) + "" : "0"));
                        ps3.setString(5, (((Integer) p.getTabla().getValueAt(j, 2) != null)
                                ? (Integer) p.getTabla().getValueAt(j, 2) + "" : "0"));
                        ps3.setString(6, (((Integer) p.getTabla().getValueAt(j, 3) != null)
                                ? (Integer) p.getTabla().getValueAt(j, 3) + "" : "0"));
                        ps3.setString(7, (((Integer) p.getTabla().getValueAt(j, 4) != null)
                                ? (Integer) p.getTabla().getValueAt(j, 4) + "" : "0"));
                        ps3.execute();
                    }



                    int alimInicial = m.getAlimentoInicial();
                    int diaAlimMax = m.getDiaAlimentoMax();
                    int alimMax = m.getAlimentoMax();
                    int alimFinal = m.getAlimentoFinal();
                    int fechaInicio = modeloDatos.getDate1();
                    int fechaFin = modeloDatos.getDate2();
                    int temperatura = modeloDatos.getTemperatura();
                    int tamañoInicial = modeloDatos.getTamañoInicial();
                    int luminosidad = modeloDatos.getLuminosidad();


                    ps = conexion.prepareStatement(query1);
                    ps2 = conexion.prepareStatement(query2);


                    ps.setInt(1, i);
                    ps.setString(2, idExperimento);
                    ps.setInt(3, alimInicial);
                    ps.setInt(4, diaAlimMax);
                    ps.setInt(5, alimMax);
                    ps.setInt(6, alimFinal);
                    ps.setInt(7, fechaInicio);
                    ps.setInt(8, fechaFin);
                    ps.setInt(9, temperatura);
                    ps.setInt(10, tamañoInicial);
                    ps.setInt(11, luminosidad);
                    ps.execute();

                    ps2.setString(1, idExperimento);
                    ps2.setString(2, investigador);
                    ps2.setString(3, tipoBacteria);
                    ps2.execute();
                }
            } catch (SQLException ex) {
                Logger.getLogger(InterfazFormatosBbddImplementation.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    if (ps != null) {
                        ps.close();
                    }
                    if (ps2 != null) {
                        ps2.close();
                    }
                    if (ps3 != null) {
                        ps3.close();
                    }
                    if (conexion != null) {
                        conexion.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(InterfazFormatosBbddImplementation.class.getName()).log(Level.SEVERE, null, ex);
                }
            }



        }
    }
}
